
typedef int ElemType;

//算法设计思想：
//从前向后扫描数组元素，标记出一个可能成为主元素的元素Num。
//然后重新计数，确认Num是否是主元素。
//1.选取候选的主元素。依次扫描所给数组中的每个整数，
//将第一个遇到的整数Num保存到x中，记录Num为1；
//若遇到的下一个整数仍等于Num，则计数加1，否则计数减1；
//当计数减到0时，将遇到的下一个整数保存x中，计数重新记为1，
//开始新一轮计数，即从当前位置开始重复上述过程，直到扫描完全部数组元素
//2.判断x中元素是否是真正的主元素。再次扫描该数组，统计x元素出现的次数。
//若大于n/2，则为主元素；否则，序列中不存在主元素。
//算法时间复杂度为O(n)，空间复杂度为O(1)
int Majority(ElemType A[], int n) {
    int count = 1;
    ElemType x = A[0];
    int i;
    for (i = 1; i < n; i ++) {
        if (A[i] == x) {
            count ++;
        } else if (count > 0) {
            count --;
        } else {
            x = A[i];
            count = 1;
        }
    }
    if (count > 0) {
        for(int i = 0, count = 0; i < n; i ++) {
            if (x == A[i]) {
                count ++;
            }
        }
        if (count > n / 2) {
            return x;
        }
    }
    return -1;
}